W tym submodule zajmiemy się wygenerowaniem listy tagów w prawej kolumnie.
Każdy tag będzie linkiem, który – podobnie jak w każdym artykule – będzie filtrował listę tytułów w lewej kolumnie. To jeszcze nie będzie chmura tagów – na razie interesuje nas tylko lista unikalnych tagów, w postaci linków. Twój efekt może różnić się od tego na powyższym obrazku, w zależności od tagów dodanych do Twoich artykułów.
Przed chwilą dla każdego z artykułów wygenerowaliśmy linki z tagami tego artykułu. Czy nie moglibyśmy przy okazji takich samych linków dodać do prawej kolumny?
Problem leży w tym, że jeśli dwa artykuły mają ten sam tag, to dodalibyśmy go dwukrotnie. Dlatego musimy zastosować inne podejście.
Parę słów o tablicach
Zanim przejdziemy do rozwiązania tego problemu, musimy nieco lepiej zapoznać się z tablicami. Przypomnimy, że spotkaliśmy się z nimi przy okazji użycia funkcji split. Stąd wiesz już, że tablica jest kolekcją wartości, i możemy po niej iterować za pomocą pętli for-of.
Za chwilę zaczniemy używać tablic w inny sposób niż dotychczas. Przeczytaj w naszym poradniku JS cały rozdział dotyczący tablic.
Jeśli chcesz, możesz stworzyć nowy CodePen i wklejać do niego przykłady z poradnika – to pomoże Ci lepiej zrozumieć tablice, z których za chwilę będziemy korzystać.
Pamiętaj, że informacji z poradnika nie musisz uczyć się na pamięć – możesz mieć go cały czas pod ręką. Oczywiście, poradnik zawiera tylko podstawowe możliwości wykorzystania tablic – ale te informacje w zupełności wystarczą nam do zrealizowania tego etapu projektu.
Wyświetlenie listy tagów
Najpierw dodajmy nową stałą ustawień – optTagsListSelector z wartością .tags.list. Ten selektor pozwoli nam na odnalezienie listy tagów w prawej kolumnie.
Do stworzenia naszej tablicy unikalnych tagów wykorzystamy funkcję generateTags. W poniższym szablonie oznaczyliśmy nowe pozycje algorytmu jako [NEW]. Pozostałe fragmenty funkcji pozostawiamy nieuzupełnione – były elementem poprzedniego submodułu.
function generateTags(){
let allTags = [];
if(allTags.indexOf(linkHTML) == -1){
allTags.push(linkHTML);
}
const tagList = document.querySelector('.tags');
tagList.innerHTML = allTags.join(' ');
}
Zastanówmy się, co się tutaj dzieje:
1. Dla każdego artykułu znajdujemy jego tagi (kod pod komentarzem /* get tags from data-tags attribute */).
2. Dla każdego z tych tagów jest generowany kod HTML linka (kod pod komentarzem /* generate HTML of the link */).
3. Sprawdzamy, czy dokładnie taki link mamy już w tablicy allTags (kod pod komentarzem /* [NEW] check if this link is NOT already in allTags */).
4. Jeśli go nie mamy, dodajemy go do tej tablicy (kod pod komentarzem /* [NEW] add generated code to allTags array */).
5. Na końcu funkcji znajdujemy listę tagów (kod pod komentarzem /* [NEW] find list of tags in right column */) i dodajemy do niej wszystkie linki znajdujące się w tablicy allTagsLinks, łącząc je ze sobą za pomocą spacji (kod pod komentarzem /* [NEW] add html from allTags to tagList */). Pamiętaj, że te fragmenty muszą znajdować się poza pętlą!
Podsumowując, tablica allTags służy nam tutaj tylko za katalog, który informuje nas, czy dany tag już widzieliśmy, czy jeszcze nie. Jednocześnie jest zbiorem linków (a konkretniej – tekstów, które zawierają kod HTML linków), które później wstawiamy do listy tagów w prawej kolumnie.
Oczywiście, to samo zadanie można zrealizować na mnóstwo innych sposobów, a to jest tylko jeden z nich. Jest to jednak zupełnie dobre rozwiązanie, skoro pozwoliło nam na wygenerowanie listy unikatowych tagów (i linków do nich).
Usunięcie listy tagów z prawej kolumny
Nie zapomnij usunąć z kodu HTML przykładowych linków do tagów. Nie będą nam już potrzebne, ponieważ generujemy tę listę za pomocą funkcji generateTags.
Liczba wystąpień tagu
W celu wyświetlenia chmury tagów będziemy potrzebowali znać liczbę wystąpień danego tagu. Będzie nam też potrzebna największa i najmniejsza liczba wystąpień. Jednak nie wszystko naraz – zaczniemy od wyświetlenia listy wystąpień w każdym z linków w prawej kolumnie. Oznacza to, że będą się one różnić od tagów na końcu artykułu – będziemy musieli osobno je wygenerować.
Zanim je wygenerujemy, musimy jakoś dla każdego tagu zapisać liczbę jego wystąpień. W tym wypadku tablica nie będzie bardzo przydatna, ponieważ dla każdego tagu potrzebujemy przechowywać dwie, powiązane ze sobą informacje – jaki to tag oraz ile razy wystąpił. Do tego celu o wiele bardziej przydadzą nam się obiekty!
Poznajemy obiekty
Obiekty są strukturą danych, podobnie jak tablice (ang. arrays). Mają jednak kilka kluczowych różnic, dzięki którym będą dla nas przydatne w innych sytuacjach.
Metafora — obiekt
Podobnie jak tablicę, obiekt porównamy do pudełka, w którym jest wiele małych pudełek.
W przeciwieństwie do tablicy, w obiekcie te małe pudełka nie są ułożone w jakiejś kolejności – zamiast tego, każde pudełko ma swoją etykietę.
Aby wybrać któreś małe pudełko, zamiast mówić "biorę pierwsze pudełko", powiemy "biorę pudełko z etykietą: zabawki dla kota".
Główną różnicą pomiędzy tablicami (arrays) a obiektami jest sposób przechowywania danych. W tablicy każda wartość miała swój indeks, czyli kolejny numer. W obiekcie każda wartość będzie miała klucz, czyli swoją "nazwę".
Wszystkie niezbędne informacje o obiektach, które będą Ci potrzebne do realizacji tego projektu, znajdziesz w naszym poradniku JS, gdzie umieściliśmy cały rozdział dotyczący tablic.
Jeśli masz ochotę, załóż nowy CodePen (lub wykorzystaj CodePen założony do nauki tablic) i wklej do niego przykłady z poradnika.
Budujemy obiekt liczący tagi
Chcemy zliczać wystąpienia każdego tagu. Do tej pory korzystaliśmy z tablicy allTags, w której wartościami były unikalne linki do tagów.
Ta tablica, po wyświetleniu za pomocą console.log, mogła wyglądać np. tak:
['<li><a href="#tag-code">code</a></li>', '<li><a href="#tag-news">news</a></li>']
Do zliczania wystąpień tagów wykorzystamy obiekt – chcemy, aby wyglądał np. tak:
{
cat: 3,
cactus: 1,
scissors: 2
}
Użyliśmy tutaj wieloliniowego formatu zapisu obiektu (czyli z Enterem pomiędzy każdą parą klucz-wartość). Dzięki temu łatwiej będzie nam zrozumieć, co znajduje się w obiekcie. W kodzie JS również możemy używać tego zapisu przy tworzeniu obiektów.
Możemy zaczynać wprowadzanie zmian. Pamiętaj, że dopóki nie skończymy następnych podrozdziałów, nasz kod nie będzie działał poprawnie.
Zmieniamy tablicę na obiekt
Zacznij od znalezienia tego fragmentu kodu:
let allTags = [];
Zamiast tablicy chcemy wykorzystać obiekt, więc musimy zmienić ten fragment na:
let allTags = {};
Zauważ, że zmieniamy też komentarz, aby odpowiadał temu, co mamy w kodzie.
Dodawanie nowych tagów do obiektu
Kolejny fragment, który musimy znaleźć, to:
if(allTags.indexOf(linkHTML) == -1){
allTags.push(linkHTML);
}
Musimy go zmienić, ponieważ teraz korzystamy z obiektu, w którym chcemy zliczać wystąpienia tagów. Zacznijmy od obsłużenia sytuacji, w której w obiekcie allTags nie mamy jeszcze danego tagu. Wtedy licznik wystąpień tego tagu ustawiamy na 1.
if(!allTags[tag]) {
allTags[tag] = 1;
}
Zwróć uwagę, że w warunku użyliśmy wykrzyknika (!), czyli zastosowaliśmy negację. Dlatego warunek czytamy jako "jeśli allTags NIE MA klucza tag". Więcej o negacjach warunków dowiesz się z naszego poradnika JS.
Zliczanie wystąpień tagu
Jeśli natomiast ten tag już znajduje się w allTags, zwiększymy licznik wystąpień o 1. Dopiszemy więc blok else:
if(!allTags[tag]) {
allTags[tag] = 1;
} else {
allTags[tag]++;
}
W tym bloku użyliśmy operatora inkrementacji – znaki ++ zwiększają liczbę o 1. Więcej informacji znajdziesz w naszym poradniku JS.
Teraz zamknij ostatnią linię kodu w komentarz, aby przestała działać, i dodaj console.log, aby sprawdzić, co znajduje się w obiekcie allTags:
console.log(allTags);
Taki sposób na chwilowe wyłączenie – czy zakomentowanie – fragmentu kodu, jest bardzo często używane przez programistów. Dzięki temu nie musisz kasować linii kodu, która aktualnie nie działa, ale za chwilę będzie Ci potrzebna.
Sprawdź w konsoli, jak wygląda zawartość obiektu allTags. Powinna przypominać strukturę, którą przed chwilą pokazaliśmy, czyli:
{
cat: 3,
cactus: 1,
scissors: 2
}
Generowanie linków do listy tagów
Pozostaje nam wygenerować kod HTML linków do umieszczenia na liście tagów w prawej kolumnie. Przy każdym tagu chcemy wyświetlić w nawiasach liczbę jego wystąpień. W tym celu zamień ten fragment kodu:
console.log(allTags);
na następujący:
let allTagsHTML = '';
for(let tag in allTags){
allTagsHTML += tag + ' (' + allTags[tag] + ') ';
}
tagList.innerHTML = allTagsHTML;
Zwróć uwagę, że używamy tutaj operatora += do doklejania kolejnego linka do zmiennej allTagsHTML. Możesz poczytać o nim więcej w naszym poradniku JS.
Jak widzisz, zamiast linka generujemy tylko nazwę tagu oraz liczbę jego wystąpień. Popraw ten fragment kodu tak, aby był generowany poprawny kod HTML linka.
Podsumowanie dotychczasowych zmian
Po tej zmianie wszystko powinno działać poprawnie. Lista linków do tagów w prawej kolumnie powinna się znów generować, tym razem jednak z informacją o liczbie wystąpień.
Zostało nam już niewiele pracy – musimy już tylko zróżnicować rozmiary tagów. Na końcu nieco zmienimy style, aby linki do tagów nie wyświetlały się jeden pod drugim, tylko inline'owo.
Zamiana listy tagów w chmurę
Cały czas trzymamy się jednej z dobrych praktyk, która mówi, aby nie zmieniać wyglądu strony bezpośrednio za pomocą kodu JS. Podobnie i tym razem, nie będziemy zmieniać rozmiarów czcionek, tylko nadawać klasy – załóżmy, że będzie ich 5, i będą wpływać na rozmiar czcionki. Pierwszą nazwiemy je tag-size-1, a ostatnią – tag-size-5.
Znalezienie skrajnych liczb wystąpień
Załóżmy, że w momencie generowania linka do tagu cactus wiemy, że występuje on w 7 artykułach. Czy to dużo, czy mało? Aby to ustalić, musimy wiedzieć w ilu artykułach pojawia się najrzadszy z tagów, a w ilu – najbardziej popularny.
W tym celu znajdź ten fragment kodu:
let allTagsHTML = '';
przed tym fragmentem dodamy następujące linie kodu:
const tagsParams = calculateTagsParams(allTags);
console.log('tagsParams:', tagsParams)
Jeszcze nie mamy takiej funkcji, więc przed funkcją generateTags dodaj jej deklarację. Funkcja ta będzie przyjmować jeden argument, który nazwiemy tags. Jej zadaniem będzie znalezienie najmniejszej i największej liczby wystąpień. Te dwie liczby mają zostać zwrócone w postaci obiektu, który będzie zawierał dwa klucze: max i min.
Zanim przejdziemy dalej, krótkie wyjaśnienie – określenie "params" jest skrótem od parameters, czyli parametrów. To jedno z dość często używanych słów w JS, podobnie jak "opts" dla options czy "elem" dla elements.
Spróbuj samodzielnie
Najpierw spróbuj przemyśleć algorytm działania tej funkcji. Wiesz, że argumentem będzie allTags, którego kluczami są tagi, a wartościami – liczby wystąpienia tagu.
Rezultatem zwracanym przez funkcję ma być obiekt, który może wyglądać np. tak:
{
min: 2,
max: 7
}
Podpowiemy, że będzie potrzebna pętla iterująca przez wszystkie tagi w obiekcie podanym jako argument funkcji. Czy domyślasz się, jakie operacje będziemy wykonywać dla każdego tagu?
Aby nie psuć Ci okazji do samodzielnej pracy – która jest najlepszą formą nauki – ukryliśmy rozwiązanie tego problemu pod poniższym guzikiem. Kliknij go, kiedy zechcesz poznać rozwiązanie.
Wcześniej jednak podpowiemy, że do rozwiązania tego problemu przydadzą Ci się dwie funkcje z biblioteki Math – przykłady znajdziesz w naszym poradniku JS. ;)
Pokaż opis rozwiązania
Ukryj opis rozwiązania
Dokończenie funkcji calculateTagsParams
Funkcję calculateTagsParams zaczniemy od zdefiniowania stałej params, której wartością będzie obiekt zawierający dwa klucze – max z wartością 0 i min z wartością 999999. Założymy, że nasz skrypt obsłuży maksymalnie milion artykułów z takim samym tagiem – to raczej bezpieczne założenie. ;)
Wyjaśnienia dla zainteresowanych
Ustawiamy takie początkowe wartości max i min, aby wykluczyć szansę na to, że wpłyną one na finalne wartości tych parametrów.
Łatwiej jest zrozumieć max niż min – ustawiamy max na 0, żeby potem podnosić tę wartość od największej liczby wystąpień tagu.
A co z min? Załóżmy przez chwilę, że ustawiliśmy min początkową wartość 1, ale najmniej popularny tag występuje w pięciu artykułach. Na końcu działania skryptu min dalej miałoby wartość 1, a nie 5. Wynika to z faktu, że zmieniamy wartość min tylko i wyłącznie, kiedy liczba wystąpień danego tagu jest mniejsza od min. Dlatego chcemy, aby początkowa wartość min była bardzo duża – z założenia większa niż docelowa wartość.
To właśnie ten obiekt – params – funkcja będzie zwracać na końcu. Możesz od razu dodać return params; na końcu funkcji.
Pomiędzy tymi liniami wykorzystamy pętlę for-in, która będzie iterować przez cały obiekt, przekazany do funkcji jako argument. Jeśli argument funkcji calculateTagsParams nazwaliśmy tags, to pętla będzie wyglądać następująco:
for(let tag in tags){
console.log(tag + ' is used ' + tags[tag] + ' times');
}
Wewnątrz tej pętli musimy ustawić wartości dla params.max – będzie to tags[tag], ale tylko jeśli ta liczba jest większa niż dotychczasowa wartość params.max.
Jest kilka sposobów, aby to osiągnąć. Przedstawiamy je na poniższych zakładkach. Wybór rozwiązania nie jest oczywisty i zależy w dużej mierze od przyjętej konwencji. Różnica w wydajności pomiędzy tymi metodami jest mała, ale short if może działać o 5-10% wolniej. Przy jednorazowym jego zastosowaniu nie stanowi to jednak istotnej różnicy.
Standardowy if
Najprostszym sposobem będzie standardowy blok if:
if(tags[tag] > params.max){
params.max = tags[tag];
}
Short if
Krótszą formą może być wykorzystanie short ifa, który opisaliśmy w naszym poradniku JS. Jeśli warunek będzie fałszywy, po prostu przypisze do params.max dotychczasową wartość params.max, czyli nic się nie zmieni.
params.max = tags[tag] > params.max ? tags[tag] : params.max;
Math.max
Kolejnym rozwiązaniem może być wykorzystanie funkcji Math.max, która zwraca największą z podanych liczb.
params.max = Math.max(tags[tag], params.max);
W analogiczny sposób znajdziesz najmniejszą liczbę wystąpień – wystarczy, że zamiast param.max użyjesz param.min. W zależności od wybranego rozwiązania, zmień też > na < lub Math.max na Math.min.
Jeśli wszystko poszło dobrze, funkcja calculateTagsParams jest gotowa i powinna zwracać największą i najmniejszą liczbę wystąpień tego samego tagu.
Oczekiwany efekt
Po dokończeniu funkcji calculateTagsParams w konsoli powinniśmy zobaczyć taką linię:
tagsParams: {max: 10, min: 2}
U Ciebie te liczby będą się zapewne różnić od tego przykładu, ale dzięki temu widzisz, że nasza funkcja z powodzeniem znalazła największą i najmniejszą liczbę wystąpień tagów. Za chwilę użyjemy tych liczb, aby dla każdego tagu wybrać jedną z klas decydujących o rozmiarze jego czcionki.
Wybranie klasy dla tagu
Ostatnim krokiem będzie wybranie jednej z 5 klas. Chcielibyśmy jednak, żeby nasz skrypt był w miarę elastyczny i pozwalał na łatwą zmianę liczby klas wpływających na rozmiar tagu w chmurze, jak również na nazwy tych klas.
Znajdź miejsce w kodzie, w którym zapisujesz ustawienia, czyli stałe, których nazwa zaczyna się od opt. Dodaj kolejne stałe:
optCloudClassCount o wartości 5,
optCloudClassPrefix o wartości tag-size-.
Następnie, przed deklaracją funkcji generateTags dodaj deklarację nowej funkcji – calculateTagClass, która będzie przyjmować dwa argumenty. Nazwijmy je count i params. Za chwilę zajmiemy się jej napisaniem, ale najpierw zastosujmy ją przy generowaniu linków.
Znajdź teraz fragment kodu odpowiedzialny za generowanie kodu HTML linka dodawanego do chmury tagów. Ta linia kodu powinna zaczynać się od allTagsHTML +=.
W generowanym kodzie HTML linka dodaj atrybut class="". Jako wartość tego atrybutu wstaw wartość zwracaną przez funkcję calculateTagClass, której przekażemy dwa argumenty – liczbę wyświetleń tagu oraz stałą tagsParams.
Jeśli nie masz pewności, jak to zrobić, zacznij od wpisania w nowej linii:
const tagLinkHTML = calculateTagClass(allTags[tag], tagsParams);
console.log('tagLinkHTML:', tagLinkHTML);
Następnie, do wartości tagLinkHTML "doklejaj" kolejne fragmenty tekstu, będącego kodem HTML, np:
const tagLinkHTML = '<li>' + calculateTagClass(allTags[tag], tagsParam) + '</li>';
console.log('tagLinkHTML:', tagLinkHTML);
W ten sposób możesz, krok po kroku, zbudować cały kod HTML linka, który należy wstawić zamiast kodu generowanego do tej pory. Innymi słowy, następnie znajdziesz linię zaczynająca się od allTagsHTML += i zmienisz ją na:
allTagsHTML += tagLinkHTML;
Na razie możesz nadal przy każdym linku wyświetlać liczbę wyświetleń – przyda nam się przy sprawdzaniu, czy rzeczywiście najczęściej występujące tagi mają największy rozmiar czcionki.
Spróbuj samodzielnie
Działanie tej funkcji nie będzie wymagało żadnej nowej wiedzy, więc spróbuj samodzielnie napisać algorytm działania tej funkcji. Poświęć na to nie więcej niż 10-15 minut.
Jeśli uda Ci się napisać algorytm, poświęć kolejne 30 minut na próbę samodzielnego stworzenia kodu tej funkcji.
Czasy, które tutaj podaliśmy, są oczywiście tylko wskazówką. To rozwiązanie wymaga trochę matematycznego myślenia, więc nie chcemy, żeby zbyt dużo czasu zeszło Ci na przypominanie sobie lekcji matmy ze szkoły. ;)
Pokaż opis rozwiązania
Ukryj opis rozwiązania
Dokończenie funkcji calculateTagClass
Algorytm działania tej funkcji będzie wymagał odrobiny matematyki. Chcemy dowiedzieć się, która z 5 klas będzie odpowiednia dla danego tagu. Będzie to pierwsza z klas, jeśli liczba wystąpień danego tagu będzie w dolnych 20% zakresu pomiędzy najmniejszą, a największą liczbą wystąpień.
Tworzenie algorytmu
Weźmy na przykład tag, który ma 6 wystąpień. Załóżmy, że params wygląda tak:
{
min: 2,
max: 10
}
Skoro najmniejsza liczba wystąpień to 2, to interesuje nas tylko to, o ile więcej wyświetleń ma dany tag. Wynika to z faktu, że interesuje nas tylko, gdzie nasza liczba wystąpień leży pomiędzy minimum a maksimum. Dlatego "znormalizujemy" liczby, czyli sprawimy by odpowiadały na pytanie "jak daleko mam do najmniejszej liczby?".
W naszym przykładzie tag ma o 4 wystąpienia więcej od najmniejszej liczby, a maksimum – 8.
Kiedy podzielimy 4 przez 8 uzyskamy wynik 0.5 czyli 50%. To oznacza, że nasza liczba wystąpień jest dokładnie pośrodku pomiędzy najmniejszą a największą. Z tego wynika, że ten tag będzie miał średni rozmiar – spośród pięciu możliwych klas wybierzemy tag-size-3.
Jak z 0.5 uzyskaliśmy 3 w nazwie klasy? Wystarczy, że skorzystamy z tego samego algorytmu, jaki wykorzystaliśmy przy losowaniu liczby całkowitej. To było dwa moduły temu, więc przypomnimy:
- mnożymy nasz ułamek przez szerokość zakresu liczb, które chcemy otrzymać,
- dodajemy najmniejszą liczbę z zakresu.
W naszym przypadku zakresem są liczby od 1 do 5 – a konkretniej do liczby zapisanej w optCloudClassCount. Najmniejszą liczbą jest 1, a szerokość w tym przypadku jest równa największej liczbie – 5. Wynik zaokrąglamy w dół. Czyli 0.5 * 5 + 1 daje wynik 3.5, który po zaokrągleniu w dół da 3.
Sprawdzenie i poprawa algorytmu
Zanim przejdziemy do zapisania kodu JS, warto sprawdzić, czy znaleźliśmy poprawny algorytm. Sprawdza się on dla liczby wystąpień równej 6, ale sprawdźmy nasze rozumowanie dla skrajnych liczb. Wiemy, że minimalna liczba wystąpień to 2, czyli o 0 więcej od minimum. Wtedy podzielimy 0 przez 8 i uzyskamy 0. Podstawiając do powyższego wzoru, 0 * 5 + 1 daje wynik 1. Wszystko się zgadza!
A jak zachowa się nasz algorytm dla maksymalnej liczby wystąpień? Znormalizowana liczba będzie – podobnie jak maksimum – o 8 większa od minimum. Czyli podzielimy 8 przez 8 i uzyskamy 1. Podstawiając do wzoru, 1 * 5 + 1 da wynik 6. To niedobrze – największą z liczb miało być 5!
Błąd wynika z tego, że użyliśmy algorytmu opartego o Math.random, który nigdy nie przyjmie wartości 1 – a w naszym wypadku możemy mieć wartość 1. Dlatego musimy zmniejszyć zakres liczb o 1, czyli zamiast 1 * 5 + 1 będziemy używać 1 * 4 + 1, które daje wynik 5. Po podstawieniu innych wartości zobaczymy, że dla liczby wystąpień równej 2 (minimalna) nadal otrzymamy 1, a dla początkowego przykładu z 6 wynikiem będzie 3.
Uwzględnimy tę zmianę algorytmu, pisząc nasz kod.
Zapisanie algorytmu jako kod JS
Spróbujmy teraz zapisać każde z powyższych obliczeń za pomocą kodu JS. Zaczęliśmy od odjęcia 2 od 6, czyli:
const normalizedCount = count - params.min;
Następnie zmniejszyliśmy 10 – również o 2:
const normalizedMax = params.max - params.min;
W kolejnym kroku podzieliliśmy te dwie liczby – 4 i 8:
const percentage = normalizedCount / normalizedMax;
I wreszcie, zastosowaliśmy algorytm znany z losowania liczby całkowitej:
const classNumber = Math.floor( percentage * (optCloudClassCount - 1) + 1 );
Zauważ, że te każdą z tych stałych omówiliśmy wcześniej. W tym podejściu rozbiliśmy nasz problem na kolejne kroki, i każdy z nich zapisaliśmy jako kod JS.
Inne podejście do zapisania algorytmu w postaci kodu JS
Nie jest to jednak jedyne możliwe podejście – możemy też zacząć od ostatniego obliczenia, które napisaliśmy, wykorzystując przykładowe liczby. Następnie za każdą z nich możemy podstawić to, w jaki sposób ją osiągnęliśmy. W ten sposób, krok po kroku, dojdziemy do finalnej wersji tego równania.
W poniższym przykładzie wielokrotnie wpisujemy tę samą linię kodu. Za każdym razem zmieniamy w niej jedną rzecz, aby zbliżyć się do finalnej wersji tej ewoluującej linii kodu.
classNumber = Math.floor( 0.5 * 5 + 1 );
classNumber = Math.floor( 0.5 * optCloudClassCount + 1 );
classNumber = Math.floor( ( 4 / 8 ) * optCloudClassCount + 1 );
classNumber = Math.floor( ( (6 - 2) / (10 - 2) ) * optCloudClassCount + 1 );
classNumber = Math.floor( ( (count - 2) / (10 - 2) ) * optCloudClassCount + 1 );
classNumber = Math.floor( ( (count - 2) / (params.max - 2) ) * optCloudClassCount + 1 );
classNumber = Math.floor( ( (count - params.min) / (params.max - 2) ) * optCloudClassCount + 1 );
classNumber = Math.floor( ( (count - params.min) / (params.max - params.min) ) * optCloudClassCount + 1 );
Oczywiście, otrzymaliśmy ten sam wynik, co w przypadku poprzedniego sposobu. Jest tylko inaczej zapisany – zamiast rozbicia na poszczególne stałe, zapisaliśmy wszystko w jednej linii.
Możesz pomyśleć, że mogliśmy podejść do tego problemu inaczej – np. podając Ci gotowe rozwiązanie. Mogliśmy też użyć ilustracji czy metafor, aby uprościć Ci zrozumienie problemu. Zależało nam jednak na tym, aby pokazać Ci sposób – a nawet dwa – w jaki developer doszedłby do tego rozwiązania.
Niezależnie od tego, który sposób wybierzesz, ważne aby udało Ci się rozłożyć dany problem na poszczególne kroki, następnie każdy krok zapisać jako kod JS, który w rezultacie wykona algorytm skryptu.
Tak czy inaczej, ten problem już jest za nami. Wystarczy dodać linię, która zwróci z funkcji stałą optCloudClassPrefix i dołączoną do niej stałą classNumber.
Oczekiwany efekt
Jeśli wszystko poszło poprawnie, sprawdzając listę tagów za pomocą inspektora, zobaczysz różne klasy tag-size-X przy różnych tagach w prawej kolumnie:
Dopracowanie chmury tagów
Pozostałe kroki wykonaj samodzielnie:
- zdecyduj, ile chcesz mieć różnych rozmiarów tagów,
- w SCSS zapisz deklaracje rozmiarów czcionek dla klas
tag-size-X (możesz wykorzystać wartości procentowe),
- jeśli chcesz, klasom
tag-size-X możesz też przypisać różne kolory,
- zmodyfikuj listę tagów tak, aby tagi były wyświetlane inline'owo,
- usuń liczby wyświetleń z kodu generującego kod HTML linków.
To wszystko! W efekcie na Twojej stronie powinna pojawić się ciekawa chmura tagów, w której najpopularniejsze tagi będą wyświetlone największą czcionką.
Te wszystkie zmiany nie powinny były mieć wpływu na działanie klikania w tag. Sprawdź, czy lista jest nadal tak samo filtrowana.